package com.hbt.android.kotlin.learn



/**
 * 函数的定义
 */
fun sum1(a: Int, b: Int):Int {
    // a，b是入参，返回是Int
    return a + b
}

/**
 * 表达式作为函数体
 */
fun sum2(a: Int, b: Int) = a + b

/**
 * public 方法则必须明确写出返回类型
 */
public fun sum3(a:Int, b: Int): Int = a + b

/**
 * 无返回值的函数
 */
fun sum4(a: Int, b: Int) {
    print(a + b)
}

/**
 * 可变长参数函数，使用vararg关键字来标识
 */
fun vars(vararg args: Int) {
    for (arg in args) {
        print(arg)
    }
}

/**
 * lambda 匿名函数
 */
val sumLambda: (Int, Int) -> Int = {a, b -> a + b}


/**
 * 当一个引用可能为 null 值时, 对应的类型声明必须明确地标记为可为 null。
 */
fun parseInt(str: String): Int? {
    // ...
    var int: Int = 0
    try {
        int = str.toInt()
    } catch (e: Exception) {

    }
    return int;
}

/**
 * 使用 is 运算符检测一个表达式是否某类型的一个实例
 */
fun getStringLength(obj: Any): Int? {

    if (obj is String) {
        return obj.length
    }

    if (obj !is String) {
        return null
    }

    if (obj is String && obj.length > 0) {
        return obj.length
    }

    // 这里obj依然是Any的引用
    return null
}


fun main() {
    sum1(1 ,2 )
    sum2(1 ,2 )
    sum3(1 ,2 )
    vars(1 ,2 )
    sumLambda(1 ,2 )


    var str: String = "1234"
    val parseInt = parseInt(str)
    print(parseInt)

    val x = parseInt(str)
    val y = parseInt(str)
    // 直接使用 `x * y` 会导致错误, 因为它们可能为 null.
    if (x != null && y != null) {
        // 在进行过 null 值检查之后, x 和 y 的类型会被自动转换为非 null 变量
        print(x * y)
    }


    val stringLength = getStringLength(str)
    print(stringLength)
}